home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / LIBFILES.D < prev    next >
Encoding:
Modula Definition  |  1990-10-24  |  6.5 KB  |  155 lines

  1.  
  2. DEFINITION MODULE LibFiles;
  3.  
  4. (*$H+    erlaubt lokale Prozeduren bei 'LibQuery' *)
  5.  
  6. (*
  7.  * Verwaltet die Speicherung von vielen Dateien in einer großen Datei.
  8.  *
  9.  * Beispielsweise werden die Symbol-Dateien (.DEF) des Compilers in
  10.  * solch einer großen Datei gespeichert, weil dies Speicherplatz
  11.  * spart und der Zugriff darauf schneller ist als wenn die Dateien
  12.  * alle einzeln vom GEMDOS in einem Unterverzeichnis verwaltet würden.
  13.  *
  14.  * Der Nachteil dieses Verfahrens: Das Einfügen neuer Dateien ist
  15.  * aufwendiger. Deshalb sollte man nur solche Dateien in einer dieser
  16.  * Library-Dateien zusammenfassen, die hauptsächlich gelesen werden
  17.  * (so wie die mitgelieferten DEF-Dateien des Modula-Systems).
  18.  *
  19.  * Das Modul 'LibManager' zeigt eine beispielshafte Anwendung dieses Moduls.
  20.  *)
  21.  
  22. FROM Files IMPORT File;
  23. FROM Directory IMPORT FileAttrSet;
  24. FROM SYSTEM IMPORT ADDRESS, BYTE;
  25.  
  26.  
  27. TYPE    LibFile = RECORD
  28.                     f: File;
  29.                     private: ADDRESS
  30.                   END;
  31.  
  32.         LibEntry = RECORD
  33.                      name: ARRAY [0..11] OF CHAR;
  34.                      attr: FileAttrSet;
  35.                      time: CARDINAL; (* gepacktes Format ! *)
  36.                      date: CARDINAL; (* gepacktes Format ! *)
  37.                      size: LONGCARD;
  38.                      start: LONGCARD
  39.                    END;
  40.  
  41.         UserData = ARRAY [0..39] OF BYTE;
  42.  
  43.         LibQueryProc = PROCEDURE ( (* entry: *) LibEntry ): BOOLEAN;
  44.  
  45.  
  46. PROCEDURE OpenLib ( VAR handle: LibFile; REF libraryName: ARRAY OF CHAR;
  47.                     VAR reply: INTEGER );
  48.   (*
  49.    * Öffnet eine vorhandene Library-Datei mit dem Namen 'libraryName'
  50.    * und liefert in 'handle' eine Zugriffskennung darauf.
  51.    *
  52.    * 'reply' liefert ggf. einen Fehlercode (negativ). Ist die Datei
  53.    * keine Library-Datei, wird in 'reply' "fBadOp" geliefert.
  54.    *
  55.    * Am Ende sollte die Libary mit 'CloseLib' wieder geschlossen werden.
  56.    *)
  57.  
  58. PROCEDURE LookUp ( VAR handle: LibFile; REF fileName: ARRAY OF CHAR;
  59.                    VAR info: LibEntry; VAR reply: INTEGER );
  60.   (*
  61.    * Sucht die Datei namens 'fileName' innerhalb der Libary mit der
  62.    * Zugriffskennung 'handle'. 'reply' liefert ggf. einen Fehlercode (negativ).
  63.    *
  64.    * Die gesuchte Datei muß dann mit den Funktionen aus dem Binary-Modul
  65.    * gelesen werden. Dazu findet sich in 'info.start' die Anfangsposition
  66.    * in der Library-Datei, in 'info.size' deren Länge. Mittels 'handle.f'
  67.    * wird auf die Libary-Datei zugegriffen.
  68.    * Siehe dazu das Modul 'LibManager' im UTILITY-Ordner.
  69.    *)
  70.  
  71. PROCEDURE LibQuery ( VAR handle: LibFile; proc: LibQueryProc;
  72.                      VAR reply: INTEGER );
  73.   (*
  74.    * Geht alle Dateien in der Library durch und ruft jedesmal 'proc' auf.
  75.    *)
  76.  
  77. PROCEDURE CloseLib ( VAR handle: LibFile );
  78.   (*
  79.    * Schließt eine mit 'OpenLib' geöffnete Libary.
  80.    *)
  81.  
  82. PROCEDURE CreateLib ( REF libraryName: ARRAY OF CHAR; VAR reply: INTEGER );
  83.   (*
  84.    * Erzeugt eine neue, leere Library-Datei.
  85.    * 'reply' liefert ggf. einen Fehlercode (negativ).
  86.    *)
  87.  
  88. PROCEDURE SetUserData ( REF libraryName: ARRAY OF CHAR;
  89.                         REF data: ARRAY OF BYTE; VAR reply: INTEGER );
  90.   (*
  91.    * Jede Library-Datei hat ein Feld reserviert, in dem das Anwenderprogramm
  92.    * beliebige Daten ablegen kann. Das Feld ist intern als 'UserData' (s.o.)
  93.    * definiert, faßt also maximal 'SIZE(UserData)' Bytes. Das Anwenderprogramm
  94.    * kann mit dieser Prozedur das Feld der Libary-Datei 'libraryName' mit
  95.    * den Daten 'data' beschreiben. Dabei darf das übergebene Datum die Größe
  96.    * von 'UserData' unter- aber nicht überschreiten, andernfalls wird der
  97.    * Laufzeitfehler 'MOSGlobals.StringOverflow' gemeldet.
  98.    * 'reply' liefert einen neg. Wert, wenn die Library-Datei nicht ansprechbar
  99.    * ist.
  100.    * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
  101.    *)
  102.  
  103. PROCEDURE GetUserData ( REF libraryName: ARRAY OF CHAR;
  104.                         VAR data: ARRAY OF BYTE; VAR reply: INTEGER );
  105.   (*
  106.    * Hiermit können die von 'SetUserData' eingetragenen Daten wieder
  107.    * ermittelt werden. Die für 'user' übergebene Variable muß ausreichend
  108.    * groß für die Daten sein - es werden nur so viele Bytes ausgelesen,
  109.    * wie die Variable fassen kann (einen Laufzeitfehler gibt's nicht).
  110.    * 'reply' liefert einen neg. Wert, wenn die Library-Datei nicht ansprechbar
  111.    * ist.
  112.    * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
  113.    *)
  114.  
  115. PROCEDURE RemoveFile ( REF libraryName, fileName: ARRAY OF CHAR;
  116.                        VAR damaged: BOOLEAN; VAR reply: INTEGER );
  117.   (*
  118.    * Enfernt die Datei 'fileName' aus dem Verzeichnis der Library namens
  119.    * 'libraryName'. Dabei kann die Länge der Library-Datei leider nicht
  120.    * verringert werden - der belegte Platz in der Library bleibt unbenutzt.
  121.    * Mit der Funktion 'CopyLib' kann die Library-Datei aber aufgeräumt werden.
  122.    * Liefert 'damaged' TRUE, ist die Lib-Datei defekt und kann nicht mehr
  123.    * benutzt werden. Deshalb sollte sie dann gelöscht werden.
  124.    * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
  125.    *)
  126.  
  127. PROCEDURE CopyLib ( REF sourceLib, destLib: ARRAY OF CHAR; VAR reply: INTEGER );
  128.   (*
  129.    * Kopiert die Libary in eine neue Datei. Dabei wird die Zieldatei
  130.    * auf die kleinstmögliche Länge verkürzt. Diese Funktion bietet sich
  131.    * an, wenn 'RemoveFile' verwendet wurde, um den unbenutzten Platz in
  132.    * der Lib-Datei zu eliminieren.
  133.    * 'destLib' darf vorher nicht existieren, sonst wird die neue Datei nicht
  134.    * erzeugt.
  135.    * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
  136.    *)
  137.  
  138. PROCEDURE AddFile ( REF libraryName: ARRAY OF CHAR; VAR entry: LibEntry;
  139.                     VAR damaged: BOOLEAN; VAR reply: INTEGER );
  140.   (*
  141.    * Fügt die in 'entry' beschriebene Datei ins Verzeichnis der Library
  142.    * namens 'libraryName' ein. Die einzufügende Datei darf noch nicht
  143.    * existieren.
  144.    * In 'entry' müssen beim Aufruf alle Daten bis auf 'entry.start' initiali-
  145.    * siert sein. Nach dem Aufruf erhält man in 'entry.start' die Dateiposi-
  146.    * tion, an die die Daten der Datei geschrieben werden müssen (z.B. mit den
  147.    * Funktionen aus 'Binary'). Es ist darauf zu achten, daß nicht mehr
  148.    * Bytes geschrieben werden, als in 'entry.size' angegeben wurde!
  149.    * Liefert 'damaged' TRUE, ist die Lib-Datei defekt und kann nicht mehr
  150.    * benutzt werden. Deshalb sollte sie dann gelöscht werden.
  151.    * Die Library-Datei muß bei Aufruf dieser Prozedur geschlossen sein!
  152.    *)
  153.  
  154. END LibFiles.
  155.